package sys.screen;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Properties;
import javax.swing.*;
import sys.utils.FileConfig;
import sys.utils.Mensagens;

public class UITelaInicial extends JWindow {

    private final int duration;
    private int percent = 0;
    private int msg = 0;
    private String[] mensagems = new String[]{
        "CARREGANDO NÚCLEO",
        "CARREGANDO MÓDULOS",
        "INICIALIZANDO MÓDULOS",
        "CONCLUÍDO"
    };
    private final Timer timer;
    private JPanel pnLoading;
    private JLabel lbPercent;

    public UITelaInicial(int d) {
        this.duration = d;
        this.pnLoading = new JPanel();
        this.pnLoading.setBounds(0, 0, 0, 2);
        //cor da linha que é preenchida
        this.pnLoading.setBackground(Color.CYAN);
        this.lbPercent = new JLabel(this.mensagems[this.msg] + ": 0%     ");
        this.lbPercent.setForeground(new Color(0, 204, 204));
        //tempo que aparece a linha carregando
        this.timer = new Timer(30, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (percent == 30) {
                    msg++;
                }
                if (percent == 60) {
                    msg++;
                }
                if (percent == 99) {
                    msg++;
                }

                pnLoading.setSize(new Dimension(percent * 5, 2));
                lbPercent.setText(mensagems[msg] + ": " + percent + "%     ");

                if (percent < 100) {
                    percent++;
                }
            }
        });

        this.timer.start();
    }

    // Este é um método simples para mostrar uma tela de apresentção
    // no centro da tela durante a quantidade de tempo passada no construtor
    private void showSplash() {
        JPanel content = (JPanel) getContentPane();
        content.setBackground(Color.WHITE);

        // Configura a posição e o tamanho da janela
        int width = 500;
        int height = 180;
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (screen.width - width) / 2;
        int y = (screen.height - height) / 2;
        setBounds(x, y, width, height);

        // Constrói o splash screen
        JLabel imagem = new JLabel(new ImageIcon(getClass().getResource("/sys/picture/splash.jpg")));
        this.lbPercent.setHorizontalAlignment(JLabel.RIGHT);
        this.lbPercent.setFont(new Font("Calibri", Font.TRUETYPE_FONT, 11));
        this.lbPercent.setPreferredSize(new Dimension(500, 27));
        JLabel lbCopyRight = new JLabel("© Copyright 2015 - CESAR DANIEL", JLabel.CENTER);
        lbCopyRight.setFont(new Font("Calibri", Font.BOLD, 11));
        lbCopyRight.setPreferredSize(new Dimension(200, 34));

        JPanel boxPnLoading = new JPanel(null);
        boxPnLoading.setPreferredSize(new Dimension(500, 1));
        boxPnLoading.setBackground(new Color(204, 204, 204));
        boxPnLoading.add(this.pnLoading);

        JPanel pnPercent = new JPanel(new BorderLayout(0, 0));
        pnPercent.setBackground(Color.WHITE);
        pnPercent.add(this.lbPercent, BorderLayout.SOUTH);
        pnPercent.add(boxPnLoading, BorderLayout.CENTER);

        JPanel pnPrincipal = new JPanel(new BorderLayout(0, 0));
        pnPrincipal.setBackground(Color.WHITE);
        pnPrincipal.add(imagem, BorderLayout.CENTER);
        pnPrincipal.add(pnPercent, BorderLayout.SOUTH);

        content.add(pnPrincipal, BorderLayout.CENTER);
        content.add(lbCopyRight, BorderLayout.SOUTH);
        //content.setBorder(BorderFactory.createLineBorder(new Color(153, 255, 255), 1));
        //Borda da tela
        content.setBorder(BorderFactory.createLineBorder(new Color(153, 255, 255), 1));
        setVisible(true);

        // Espera até que os recursos estejam carregados
        try {
            Thread.sleep(this.duration);
        } catch (InterruptedException e) {
        }

        setVisible(false);
    }

    private void showSplashAndInit() {
        showSplash();
        this.timer.stop();

        this.setVisible(false);
        UITelaInicial.abrirLogin();
        this.dispose();
    }

    public static void main(String[] args) throws IOException {

        //Se nao existir pasta com arquivo config.ini o sistema cria o arquivo vazio
        /*
         * verifica se arquivo de configuração existe. se não existir cria com
         * uma licença e a quantidade de dias determinado na geração da licença.
         * se for true, é pq a licença ainda não expirou, carrega o sistema
         * normalmente, se não expirou
         */
        FileConfig.createFileConfig();

        for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Windows".equals(info.getName())) {
                try {
                    UIManager.setLookAndFeel(info.getClassName());
                } catch (ClassNotFoundException | InstantiationException |
                        IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    Mensagens.msgErro("erro\n" + ex.getMessage());
                }
                break;
            }
        }

        if (args.length > 0) {
            UITelaInicial.abrirLogin();
        } else {
            UITelaInicial splash = new UITelaInicial(5000);
            splash.showSplashAndInit();
        }
    }

    public static void abrirLogin() {
        UILogin ui = new UILogin();
        ui.setVisible(true);
        ui.setLocationRelativeTo(null);
        ui.toFront();
    }
}
